// 问题二：自定义类作为Map的键

// 解释：
// 要自定义类作为Map的键，需要重写hashCode和==方法
// 原因：
// 1. hashCode用于快速定位键在哈希表中的位置
// 2. ==用于比较两个键是否相等
// 重写原则：
// 1. 如果两个对象相等(==)，它们的hashCode必须相同
// 2. 但hashCode相同的对象不一定相等

class Person {
  final String id;
  final String name;

  Person(this.id, this.name);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    return other is Person && other.id == id && other.name == name;
  }

  @override
  int get hashCode => id.hashCode ^ name.hashCode;

  @override
  String toString() => 'Person(id: $id, name: $name)';
}

void main() {
  // 创建两个相同的Person对象
  final person1 = Person('001', '张三');
  final person2 = Person('001', '张三');

  // 测试相等性
  print('person1 == person2: ${person1 == person2}'); // true

  // 创建Map
  final personMap = <Person, String>{};

  // 添加条目
  personMap[person1] = '开发工程师';

  // 测试访问
  print('personMap[person2]: ${personMap[person2]}'); // 能正确获取到值

  // 如果不重写hashCode和==，下面会输出null
  print('\n如果不重写hashCode和==，Map将无法正确工作');
}
